package com.ubigate.CooknaviHA;

import java.io.File;
import java.text.Collator;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;

import zipunzip.CompressionUtil;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ImageButton;
import android.widget.ListView;

//import com.google.ads.AdRequest;
//import com.google.ads.AdView;

public class MyrecipeActivity extends Activity implements OnClickListener, OnItemClickListener {
	private static final String TAG = "MyrecipeActivity";

	/** AdView **/
//	private AdView adView;
//	private AdRequest adRequest;
	
	/** Bottom Menu Button **/
	/*
	 * 아래쪽 이미지버튼 메뉴 5개를 선언 
	 */
	private ImageButton btnHome = null;		// 홈으로가는 버튼선언
	private ImageButton btnTimer = null;	// 타이머로가는 버튼 선언
	private ImageButton btnMetewand = null;	// 계량기준으로가는 버튼선언
	private ImageButton btnMyrecipe = null; // 마이레시피로가는 버튼 선언
	private ImageButton btnBack = null;		// 뒤로가기(앱종료)버튼 선언

	/** Myrecipe List **/
	/*
	 * 마이레시피의 배열리스트와 리스트뷰, 어댑터 선언
	 */
	private ListView lvMyrecipe;
	ArrayList<String> arrayList = null;
	ArrayAdapter<String> arrayAdt = null;
	
	/** File Admin Button **/
	/*
	 * 마이레시피 메뉴에서 쓰이는 버튼 4개선언
	 */
//	private ListView lvAdmMyrecipe;
	private Button btnSelect = null;	// 선택모드 버튼
	private Button btnReturn = null;	// 돌아가기 버튼
	private Button btnAll = null;		// 전체선택 버튼
	private Button btnDelete = null;	// 삭제하기 버튼
	ArrayAdapter<String> arrayAdmAdt = null;	// 마이레시피 목록배열
	
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {	// 생성시 가장 먼저 실행되는 함수, 생성함수
        super.onCreate(savedInstanceState);		// 가장 먼저 실행되게함
        setContentView(R.layout.myrecipe);		// myrecipe.xml을 불러옴
 
        // AdView
//        adView = (AdView) findViewById(R.id.adView);
        // Ad Request
//        adRequest = new AdRequest();
//        adRequest.addTestDevice("20077923D171F778409ABDFEF3C926A0");
//        adView.loadAd(new AdRequest());
        
        // Bottom menu
        /*
         * 이미지버튼 5개 정의
         */
        btnHome = (ImageButton) findViewById(R.id.btn_home);		// myrecipe.xml의 버튼중 btn_home의 id를 btnHome에 대입 
        btnTimer = (ImageButton) findViewById(R.id.btn_timer);		// myrecipe.xml의 버튼중 btn_timer의 id를 btnTimer에 대입
        btnMetewand = (ImageButton) findViewById(R.id.btn_metewand);// myrecipe.xml의 버튼중 btn_metewand의 id를 btnMetewand에 대입
        btnMyrecipe = (ImageButton) findViewById(R.id.btn_myrecipe);// myrecipe.xml의 버튼중 btn_myrecipe의 id를 btnMyrecipe에 대입
        btnBack = (ImageButton) findViewById(R.id.btn_back);		// myrecipe.xml의 버튼중 btn_back의 id를 btnBack에 대입

        /*
         * MyrecipeActivity클래스에서 오버라이드된 OnClick 함수를 사용하기위해 정의함.
         */
        btnHome.setOnClickListener(this);
        btnTimer.setOnClickListener(this);
        btnMetewand.setOnClickListener(this);
        btnMyrecipe.setOnClickListener(this);
        btnBack.setOnClickListener(this);

        // Myrecipe
        // 어댑터 설정필요
        lvMyrecipe = (ListView) findViewById(R.id.list_myrecipe); // myrecipe.xml의 리스트뷰중 list_myrecipe의 id를 lvMyrecipe에 대입

        /*
         * 1. 현재 extDir의 들어있는 콘텍스트를 반환하여 fp에 넣어준다.
         * 2. 파일명을담을 배열 files을 선언하고, 파일명을 배열형태로 넣어준다.
         * 3. arrayList에 스트링배열 공간을 할당해준다.
         * 4. 파일의 갯수만큼 반복하여 각 파일명이 디렉토리가 아닐경우만 arrayList에 추가해준다.
         */
        File fp = ((CooknaviApp)getApplicationContext()).extDir;
        File [] files = fp.listFiles();
        arrayList = new ArrayList<String>();
        for (int i=0; i < files.length; i++) {
        	if (files[i].isDirectory()) ;
        	else {
        		String sTemp = files[i].getName(); 
        		arrayList.add(sTemp);
        	}
        }
        
        Collections.sort(arrayList, arrComparator);		// arrayList를 본 클래스의 arrComparator함수의 오버라이드된 compare함수로 정렬해준다.

        // 전체 목록을 보여주기 위한 Adapter
        arrayAdt = new ArrayAdapter<String>(this, R.layout.simpleitem, arrayList);
        // arrayAdt에 arrayList의 내용을 넣어주고 xml은 simpleitem.xml로 정해준다.
        // 선택/삭제를 위한 Adapter
        arrayAdmAdt = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_multiple_choice, arrayList);
        // arrayAdmAdt에 arrayList의 내용을 넣어주고 체크박스를 추가한다.
        lvMyrecipe.setAdapter(arrayAdt);		//	리스트뷰 lvMyrecipe의 내용인 어댑터를 arrayAdt로 정해준다.	
        lvMyrecipe.setItemsCanFocus(false);		//	기본적으로 모든 리스트뷰가 체크된다.
        lvMyrecipe.setOnItemClickListener(this);// 	lvMyrecipe의 아이템을 현재 클래스의 오버라이드된 클릭리스너에 연결
        
        // File Admin
        /*
         * 버튼id와 변수를 매핑시켜준다.
         */
        btnSelect = (Button) findViewById(R.id.btn_select);
        btnReturn = (Button) findViewById(R.id.btn_return);
        btnAll = (Button) findViewById(R.id.btn_all);
        btnDelete = (Button) findViewById(R.id.btn_delete);
        
        /*
         * MyrecipeActivity클래스에서 오버라이드된 OnClick 함수를 사용하기위해 정의함.
         */
        btnSelect.setOnClickListener(this);
        btnReturn.setOnClickListener(this);
        btnAll.setOnClickListener(this);
        btnDelete.setOnClickListener(this);
    }
	
//    @Override
//    public void onDestroy() {
//    	adView.destroy();
//    	super.onDestroy();
//    }
    
    
    /*
     * Comparator를 만들고 compare의 오버라이드를 위해 씀
     */
    private final static Comparator<String> arrComparator = new Comparator<String>() {
    	private final Collator collator = Collator.getInstance();
    	
    	@Override
    	/*
    	 * compare 함수의 오버라이드
    	 * src1이 클 경우 1, 같으면 0, src2가 클 경우 -1 을 리턴한다. 
    	 */
    	public int compare(String src1, String src2) {
    		return collator.compare(src1, src2);
    	}
	};
	
	@Override
	/*
	 * 함수 onClick의 오버라이드 
	 */
	public void onClick(View v) {
		// TODO Auto-generated method stub
		int viewId = v.getId();		// 현재 클릭된 id를 viewId에 넣어줌
		int nRecipes;				// 모든 마이레시피의 개수를 넣어주기위한 변수선언
		Intent intent;				// 다른 Activity로의 이동을 위한 intent 선언
		switch (viewId) {			// 각 Id에 따른 기능을 나눔
		// Bottom Menu
		case R.id.btn_home:			// id가 btn_home일 경우, 즉 home버튼을 클릭했을 경우
			intent = new Intent(MyrecipeActivity.this, CooknaviHAActivity.class);	
			// intent변수에 MyrecipeActivity에서 CooknaviHAActivity로 이동함을 대입.
			startActivity(intent);	// 이동 실행
			break;
			
		case R.id.btn_timer:	// id가 btn_timer일 경우, 즉 타이머 버튼을 클릭했을 경우
			intent = new Intent(MyrecipeActivity.this, TimerActivity.class);
			// intent변수에 MyrecipeActivity에서 TimerActivity로 이동함을 대입.
			startActivity(intent);	// 이동 실행
			break;
			
		case R.id.btn_metewand:	// id가 btn_metewand일 경우, 즉 계량측정 버튼을 클릭했을 경우
			intent = new Intent(MyrecipeActivity.this, MetewandActivity.class);
			// intent변수에 MyrecipeActivity에서 MetewandActivity로 이동함을 대입.
			startActivity(intent); // 이동 실행
			break;
			
		case R.id.btn_myrecipe:	// id가 btn_myrecipe일 경우, 즉 마이레시피 버튼을 클릭했을 경우
			// 처리할 내용 없음
			break;
			
		case R.id.btn_back:	// id가 btn_back일 경우, 즉 뒤로가기 버튼을 클릭했을 경우
			onBackPressed();	// 뒤로가기실행(앱종료)
		// File Admin Menu
			
		case R.id.btn_select:	// id가 btn_select일 경우, 즉 home버튼을 클릭했을 경우
			Log.d(TAG, "btn_select clicked");	//	디버그 로그메시지를 보냄
			btnSelect.setVisibility(View.GONE);	//	선택하기 버튼을 공간 차지하지 않고 없앰
			btnReturn.setVisibility(View.VISIBLE);	//	돌아가기 버튼이 화면에 보임
			btnAll.setVisibility(View.VISIBLE);	//	모든선택 버튼이 화면에보임
			btnDelete.setVisibility(View.VISIBLE);	//	삭제하기 버튼이 화면에 보임
	        lvMyrecipe.setAdapter(arrayAdmAdt);		//	lvMyrecipe 리스트뷰와 arrayAdmAdt를 연결
	        lvMyrecipe.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);	//	선택할수있는 항목의 갯수를 설정(2개)
			break;
			
		case R.id.btn_return:	// id가 btn_home일 경우, 즉 home버튼을 클릭했을 경우
			Log.d(TAG, "btn_all clicked");	//	디버그 로그메시지를 보냄
			/*
			 * 위와 같음
			 */
			btnReturn.setVisibility(View.GONE);
			btnAll.setVisibility(View.GONE);
			btnDelete.setVisibility(View.GONE);
			btnSelect.setVisibility(View.VISIBLE);
	        lvMyrecipe.setAdapter(arrayAdt);
	        lvMyrecipe.setChoiceMode(ListView.CHOICE_MODE_NONE);
	        btnAll.setText(getResources().getString(R.string.str_set_all));	// 디렉토리경로를 스트링으로 가져옴
			break;
			
		case R.id.btn_all:		// id가 btn_home일 경우, 즉 home버튼을 클릭했을 경우
			Log.d(TAG, "btn_all clicked"); //	디버그 로그메시지를 보냄
			nRecipes = lvMyrecipe.getChildCount();	// 화면에보이지않는 뷰를 포함한 갯수를 nRecipes에 넣어준다.
			boolean bSetCheck = false;	// 전체선택 체크변수
			if (btnAll.getText().equals(getResources().getString(R.string.str_set_all))) bSetCheck = true;
			// 전체선택 버튼의 텍스트와 디렉토리경로의 텍스트가 같은경우 체크
			for (int i = 0;i < nRecipes; i++) lvMyrecipe.setItemChecked(i, bSetCheck);
			// 모든 뷰의 아이템박스를 체크한다.
			if (bSetCheck) btnAll.setText(getResources().getString(R.string.str_unset_all));
			// bSetCheck = true 일 경우, 전체선택버튼의 디렉토리경로 텍스트 체크를 모두 해제함
			else btnAll.setText(getResources().getString(R.string.str_set_all));
			// 아닐경우, 전체선택버튼의 디렉토리경로 텍스트 체크를 모두 체크함
			break;
			
		case R.id.btn_delete:	// id가 btn_home일 경우, 즉 home버튼을 클릭했을 경우
			Log.d(TAG, "btn_delete clicked"); //	디버그 로그메시지를 보냄
			// 체크된 파일 삭제
			long [] lArrChecked = lvMyrecipe.getCheckItemIds();	
			//	lvMyrecipe의 리스트뷰아이디를 배열lArrChecked에 넣어줌
			int nFiles4Delete = lArrChecked.length;
			//	lArrchecked의 길이를 nFiles4Delete에 넣어줌
			/*
	         * 1. 현재 extDir의 들어있는 콘텍스트를 반환하여 dir에 넣어준다.
	         * 2. 파일명을담을 배열 files을 선언하고, 파일명을 배열형태로 넣어준다.
	         * 3. arrayList에 스트링배열 공간을 할당해준다.
	         * 4. 파일의 갯수만큼 반복하여 각 파일명이 디렉토리가 아닐경우만 arrayList에 추가해준다.
	         */
			File dir = ((CooknaviApp)getApplicationContext()).extDir;
			//	현재 extDir의 들어있는 서비스의 콘텍스트를 반환하여 dir에 넣어줌
			/*
			 * 현재 체크되어있는 아이템과 그 포지션을 찾아 삭제하는 반복문
			 */
			for (int i = nFiles4Delete - 1;i >= 0; i--) {
				int position = (int)lArrChecked[i];
				File fTemp =  new File(dir, arrayList.get(position));
				fTemp.delete();
				lvMyrecipe.setItemChecked(position, false);
				arrayList.remove(position);
			}
			
			arrayAdmAdt.notifyDataSetChanged();	//	arrayAdmAdt 갱신
			arrayAdt.notifyDataSetChanged();	//	arrayAdt 갱신
			break;
		}		
	}

	/*
	 * 이쪽부분 예시를 잘 몰라서
	 * 정확히 어떤 기능인지 잘 모르겟음
	 * (non-Javadoc)
	 * @see android.widget.AdapterView.OnItemClickListener#onItemClick(android.widget.AdapterView, android.view.View, int, long)
	 */
	@Override
	public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
		// TODO Auto-generated method stub
		String sItemname = parent.getItemAtPosition(position).toString();	
		//	현재 포지션의 스트링을 sItemname에 넣어줌
		if (parent.getAdapter() == arrayAdt) {		// 만일  
	    	Log.d(TAG, "pos : "+position+", item : "+ sItemname); 
	    	//	디버그 로그메시지를 보냄
//	    	lvMyrecipe.setSelection(position);
	    	
			// 추가 처리
	    	// 1. 파일명 확인 후 SplashActivity와 동일한처리
	    	
	    	// 2. ContentActivity로 보냄
	    	//Intent intent;
	    	//intent = new Intent(MyrecipeActivity.this, ContentActivity.class);
	    	//startActivity(intent);
	    	// 파일 연결 실행
	    	//int idxFilenameStart = filepath.lastIndexOf("/");
	    	//int idxFilenameEnd = filepath.lastIndexOf(".");
	    	String path = ((CooknaviApp)getApplicationContext()).extDir.getAbsolutePath();
	    	//	서비스의 컨텍스트의 절대 경로를 path에 넣어줌
	    	String filename = sItemname.substring(0, sItemname.length()-4);
	    	//	sItemname 스트링의 뒤에서 4번째까지 짜른 스트링을 filename에 넣어준다.
	    	String filepath = path+"/"+sItemname;
	    	//	filepath = path + / + sItemname  -> 디렉토리경로를 만들어줌
	    	Log.i(TAG,"filepath = "+filepath+", filename = "+filename+", dest = "+path+"/"+filename );
	    	//	    	디버그 로그메시지를 보냄
	    	try {
	        	CompressionUtil cu = new CompressionUtil();	//	CompressionUtil의 새로운 객체 생성
	        	File destDir = new File(path+"/"+filename);	//	파일 객체 생성
	        	if (destDir.exists() == false) {	//	destDir이 존재하지않으면 생성
	        		destDir.mkdirs();
	        	}
	        	cu.unzip(new File(filepath), destDir, "MS949");	//	압축을 품
	    		/*
	    		 * 레시피의 파일경로를 가져오고, 그 xml파일을 불러와서 뿌려준다
	    		 */
	        	((CooknaviApp)getApplicationContext()).setContentPath(path+"/"+filename);
	        	((CooknaviApp)getApplicationContext()).LoadXMLRecipes(destDir+"/"+filename+".xml");
	            ((CooknaviApp)getApplicationContext()).ParseXMLRecipes();
	    		((CooknaviApp)getApplicationContext()).ParseRecipe();
	    		

	    		Intent newIntent = new Intent(MyrecipeActivity.this, ContentActivity.class);
	    		//	MyrecipeActivity에서 ContentActivity로 연결하는 인텐트
	            startActivity(newIntent);	//	인텐트 실행
	        	Log.i(TAG,filename+" Uncompressed.");	//	디버그 로그메시지를 보냄
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();	//	시스템에러출력
			}			
		} else {
	    	Log.d(TAG, "pos : "+position+", item : "+ sItemname);
	    	//	디버그 로그메시지를 보냄
//	    	lvMyrecipe.setSelection(position);
	    	
		}
	}

}
